webpack教程
前端项目构建打包工具介绍
为什么需要这些项目构建打包工具
项目构建打包工具有哪些
webpack介绍
- 是一款打包构建工具,目前就流行打包构建工具
- webpack特点: 一切皆模块, 能把所有资源打包成浏览器能识别的 html,css,js,png
- 官网地址: https://webpack.docschina.org/
安装webpack和webpack-cli
npm i webpack@3 -g
npm i webpack-cli -g
webpack -v 检查是否安装成功
(一) webpack配置-入口和出口
(1) 入口和出口概念
入口: 入口起点(entry point)指示webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。 **出口: **output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。
(2) 配置步骤
- 新建文件夹demo1
- 新建main.js,m1.js,m2.js
// main.js
import M1 from './m1.js'
console.log('我是mian.js')
console.log(M1.msg);
// m1.js
import M2 from './m2.js';
console.log(M2.msg);
export default {
name: 'm1',
msg: '我是模块m1'
}
// m2.js
export default {
name: '模块2',
msg: '我是模块2'
}
// webpack.config.js
const path = require('path');
module.exports = {
//1.配置入口文件
entry: './main.js',
//2.配置输入的名称和位置
output: {
//a.文件名
filename: 'main.js',
//b.存放的路径
path: path.resolve(__dirname, 'dist')
},
//3.打包模式 development-开发模式,production-生产模式
mode: 'production'
}
- 运行webpack命令,打包成功会在本地创建一个dist文件夹,里面有一个main.js
- 给main.js添加hash值后缀, 每次文件与变动, hash值都发生改变
output: {
//a.文件名 [hash:7]会生成7个字符的hash值
filename: 'main-[hash:7].js',
//b.存放的路径
path: path.resolve(__dirname, 'dist')
},
(二) loader配置
(1) loader是什么
在webpack眼里,一切皆模块,js、css、img、txt、vue等统统都是模块,但webpack默认只认识js模块,其它文件都需要配置相应的加载器(loader)才能正确的识别,比如css要配css-loader,vue要配vue-loader
(2) 配置css-loader
- 新建文件夹demo2.1
- npm init 初始化package.json
- 安装相关模块
npm init -y
npm i style-loader --save-dev
npm i css-loader --save-dev
- 新建main.js, main.css, webpack.config.js
// main.js
import './main.css';
// main.css
body {
background-color: gray;
}
h3 {
color: red;
}
// webpack.config.js
const path = require('path');
module.exports = {
entry: './main.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist')
},
mode: 'development',
// 对模块进行配置
module: {
// 规则
rules: [{
// 意思是: 遇到.css结尾的文件, 先使用style-loader和css-loader进行处理
test: /\.css$/,
use: ['style-loader', 'css-loader']
}]
}
}
- 运行打包命令 webpack
- 检验: 在dist(打包后生成的文件夹)文件夹内新建index.html,导入main.js,然后打开,看网页的背景颜色是否为灰色
(3) 配置less-loader
- 新建demo2.2文件夹
- 安装相关模块
npm init -y
npm i style-loader --save-dev
npm i css-loader --save-dev
npm i less-loader --save-dev
npm i less --save-dev
// 批量安装
npm i style-loader css-loader less-loader less --save-dev
- 新建main.js, main.less, webpack.config.js
// main.js
import './main.less';
// main.less
body {
background-color: gainsboro;
h3 {
color: green;
}
}
// webpack.config.js
const path = require('path');
module.exports = {
entry: './main.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist')
},
mode: 'development',
module: {
rules: [{
test: /\.less$/,
use: [
'style-loader',
'css-loader',
'less-loader'
]
}]
}
}
- 检验:在dist文件夹新建index.html,导入main.js, 打开看看h3是否变了颜色
(三) plugins(插件)
(1) 插件是什么,有什么用
loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务。
(2) 配置生成html的插件
例子1: 自动生成index.html文件
- 新建demo3.1文件夹
- 安装html-webpack-plugin
npm init -y
npm i html-webpack-plugin
- 新建main.js, webpack.config.js
// main.js
console.log('今天的天气贼好');
// webpack.config.js
const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './main.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist')
},
mode: 'development',
// 配置插件
plugins: [
new htmlWebpackPlugin()
]
}
- 检查dist文件夹,并打开index.html文件查看
(四) vue2.x中的webpack配置
vue-cli底层使用的也是webpack, 查看vue的webpack配置命令 vue-cli3搭建项目用的也是webpack,不过配置文件在vue-cli2.x是可见的,3.x就隐藏起来了,需要查看vue-cli3的配置文件,可以使用vue-cli3创建一个新的项目,然后执行以下命令
- 进入到项目根目录,执行 vue inspect 就能查看webpack配置
- 输出配置文件
vue inspect > webpack.config.js
(五) resolve别名配置和文件后缀配置
- main.js 代码
import {add} from '@/cart'
add();
- /src/cart.js 代码
export const add = ()=> {
let divEle = document.createElement('div');
divEle.innerText = '我是购物车模块';
document.body.appendChild(divEle);
}
- webpack.config.js 代码
// 导入nodejs的path
const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
// 入口配置
entry: './main.js',
// 出口配置
output: {
// 打包后的文件名称
filename: 'bundle.js',
// 配置打包后的路径,__dirname当前目录,
path: path.resolve(__dirname, 'dist')
},
mode: 'development',
plugins: [
new htmlWebpackPlugin()
],
resolve:{
alias:{
'@': path.resolve(__dirname,'src')
},
// 省略后缀名
extensions: [
'.mjs',
'.js',
'.jsx',
'.vue',
'.json',
'.wasm'
],
}
}
(六) 跨域配置
对dev-server进行一下设置,详见vue-cli3配置跨域
devServer: {
// 代理
proxy: {
// 只要请求地址有'api'都会匹配上
"/api": {
target: "http://127.0.0.1:3006",
ws: true,
// 允许跨域
changeOrigin: true,
pathRewrite: {
"^/api": "" //通过pathRewrite重写地址,将前缀/api转为/
}
}
}
}
(七) 其他前端构建打包工具
- grunt
- gulp(流)
- fis
- rollup
- webpack(万物皆模块)
- vite(快)
- ......